M1Mac上でRV32G のクロスコンパイル環境を構築(Dockerなし編)
M1Mac 上で Docker を使わずに RV32G 向けのクロスコンパイル環境を構築した。
Homebrew でインストールした riscv-gnu-toolchain では RV32 環境がうまく動かなかったんだけど、自分でソースコードを取得してビルドしたらいい感じに動いた。
うまく動かなかった理由は riscv-pk がなぜか64ビット環境向けにビルドされてしまうから。
riscv-pk は gnu-toolchain のコマンドプリフィックスを見ているっぽくて、Homebrew でインストールした時のコマンドのプリフィックスは riscv64-unknown-elf-(コマンド名) で、自分でソースコードを取得して --with-arch=rv32g オプションをつけてビルドした場合のコマンドプリフィックスは riscv32-unknown-elf-(コマンド名) 。コマンドプリフィックスが riscv32-unknown-elf になったことで riscv-pk が32ビットうまく動くようになったっぽい。
Docker を使った場合の環境構築手順はこちら
事前準備
code:sh
brew install python3 gawk gnu-sed gmp mpfr libmpc isl zlib expat texinfo flock gmp
インストールディレクトリ
/opt/riscv
インストール手順
riscv-gnu-toolchain (クロスコンパイラ) と riscv-isa-sim (Spike シミュレータ) と riscv-pk (ProxyKernel) を以下の手順でインストール。
code:sh
cd ~/src
export RV32=/opt/riscv
# GMPのライブラリがうまく参照できないので環境変数を指定
export CPPFLAGS="-I/opt/homebrew/include"
export LDFLAGS="-L/opt/homebrew/lib"
cd riscv-gnu-toolchain/
mkdir build && cd build
../configure --prefix=$RV32 --with-arch=rv32g --with-abi=ilp32d
make
make install
cd ~/src
cd riscv-isa-sim/
mkdir build && cd build
# Boostのライブラリがうまく読み込めなくなかったので、環境変数を未設定の状態に戻す
unset CPPFLAGS
unset LDFLAGS
../configure --prefix=$RV32 --with-isa=rv32g
make
make install
cd ~/src
mkdir build && cd build
export PATH=$PATH:$RV32/bin
../configure --prefix=$RV32/pk --host=riscv32-unknown-elf
make
make install
ビルドと実行
code:hello.c
int main() {
printf("Hello World\n");
printf("PI = %f\n", 3.14);
}
ビルド
code:sh
$ riscv32-unknown-elf-gcc hello.c
実行
code:sh
$ spike /opt/riscv/pk/riscv32-unknown-elf/bin/pk a.out
bbl loader
Hello World
PI = 3.140000